package menu

import (
	"fmt"
	"github.com/gofiber/fiber/v2"
	"sg-backend/global"
	"sg-backend/logger"
	"sg-backend/model/user"
	"sg-backend/utils"
)

/*
 * 2
 * POST,新增菜单请求，/api/user/menu
 */

// MenuDto 提交的数据结果
type _MenuDto struct {
	Id            uint   `json:"id"`
	Pid           uint   `json:"pid"`
	Title         string `json:"title"`
	Icon          string `json:"icon"`
	OrderNum      uint   `json:"orderNum"`
	Url           string `json:"url"`
	PrivilegeName string `json:"privilegeName"`
	Show          bool   `json:"show"`
}

func AddMenu(ctx *fiber.Ctx) error {

	// 权限验证
	utils.CheckPermsByTag("UserMenu", global.AuthUser.UserId, "add")

	// 获取数据
	var menuDto _MenuDto
	if err := ctx.BodyParser(&menuDto); err != nil {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": fmt.Sprintf("数据解释出错！%s", err),
		})
	}

	// 获取数据成功，开始验证
	var menus []user.Menu

	// 1，同层级下菜单不能重名
	noDuplicateCheck := global.DB.Where(
		"title = ? AND pid = ?", menuDto.Title, menuDto.Pid,
	).Find(&menus)
	if noDuplicateCheck.RowsAffected != 0 {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": "同层级菜单不允许重名！",
		})
	}

	// 2，权限标志要唯一
	privilegeTagCheck := global.DB.Where(
		"privilege_name = ?", menuDto.PrivilegeName,
	).Find(&menus)
	if privilegeTagCheck.RowsAffected != 0 {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": "权限标识需要全局唯一！",
		})
	}

	// 验证通过，开始创建
	newMenu := user.Menu{
		Pid: menuDto.Pid, Title: menuDto.Title, Icon: menuDto.Icon, OrderNum: menuDto.OrderNum, Url: menuDto.Url,
		PrivilegeName: menuDto.PrivilegeName, Show: menuDto.Show,
	}
	r := global.DB.Create(&newMenu)
	if r.Error != nil {
		return ctx.JSON(fiber.Map{
			"status":  "error",
			"message": "新增失败！错误：" + r.Error.Error(),
		})
	}

	// 写日志
	logger.DbInfo(global.AuthUser.Username, fmt.Sprintf("菜单创建成功！菜单：%+v", menuDto))
	return ctx.JSON(fiber.Map{
		"status":  "done",
		"message": "添加成功！",
	})

}
